home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 November / PCWNOV08.iso / Software / Freeware / Adobe Media Player 1.1 / adobe_media_player.air / AMP.swf / scripts / mx / binding / Binding.as < prev    next >
Encoding:
Text File  |  2008-07-17  |  5.4 KB  |  172 lines

  1. package mx.binding
  2. {
  3.    import mx.collections.errors.ItemPendingError;
  4.    import mx.core.mx_internal;
  5.    
  6.    use namespace mx_internal;
  7.    
  8.    public class Binding
  9.    {
  10.       mx_internal static const VERSION:String = "3.0.0.0";
  11.       
  12.       mx_internal var destFunc:Function;
  13.       
  14.       mx_internal var srcFunc:Function;
  15.       
  16.       mx_internal var destString:String;
  17.       
  18.       mx_internal var document:Object;
  19.       
  20.       private var hasHadValue:Boolean;
  21.       
  22.       mx_internal var isExecuting:Boolean;
  23.       
  24.       mx_internal var isHandlingEvent:Boolean;
  25.       
  26.       public var twoWayCounterpart:Binding;
  27.       
  28.       mx_internal var isEnabled:Boolean;
  29.       
  30.       public var uiComponentWatcher:int;
  31.       
  32.       private var lastValue:Object;
  33.       
  34.       private var wrappedFunctionSuccessful:Boolean;
  35.       
  36.       public function Binding(param1:Object, param2:Function, param3:Function, param4:String)
  37.       {
  38.          super();
  39.          this.mx_internal::document = param1;
  40.          this.mx_internal::srcFunc = param2;
  41.          this.mx_internal::destFunc = param3;
  42.          this.mx_internal::destString = param4;
  43.          mx_internal::isEnabled = true;
  44.          mx_internal::isExecuting = false;
  45.          mx_internal::isHandlingEvent = false;
  46.          hasHadValue = false;
  47.          uiComponentWatcher = -1;
  48.          BindingManager.addBinding(param1,param4,this);
  49.       }
  50.       
  51.       protected function wrapFunctionCall(param1:Object, param2:Function, param3:Object = null, ... rest) : Object
  52.       {
  53.          var result:Object = null;
  54.          var thisArg:Object = param1;
  55.          var wrappedFunction:Function = param2;
  56.          var object:Object = param3;
  57.          var args:Array = rest;
  58.          wrappedFunctionSuccessful = false;
  59.          try
  60.          {
  61.             result = wrappedFunction.apply(thisArg,args);
  62.             wrappedFunctionSuccessful = true;
  63.             return result;
  64.          }
  65.          catch(itemPendingError:ItemPendingError)
  66.          {
  67.             itemPendingError.addResponder(new EvalBindingResponder(this,object));
  68.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  69.             {
  70.                trace("Binding: destString = " + mx_internal::destString + ", error = " + itemPendingError);
  71.             }
  72.          }
  73.          catch(rangeError:RangeError)
  74.          {
  75.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  76.             {
  77.                trace("Binding: destString = " + mx_internal::destString + ", error = " + rangeError);
  78.             }
  79.          }
  80.          catch(error:Error)
  81.          {
  82.             if(error.errorID != 1006 && error.errorID != 1009 && error.errorID != 1010 && error.errorID != 1055 && error.errorID != 1069)
  83.             {
  84.                throw error;
  85.             }
  86.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  87.             {
  88.                trace("Binding: destString = " + mx_internal::destString + ", error = " + error);
  89.             }
  90.          }
  91.          return null;
  92.       }
  93.       
  94.       private function nodeSeqEqual(param1:XMLList, param2:XMLList) : Boolean
  95.       {
  96.          var _loc4_:uint = 0;
  97.          var _loc3_:uint = uint(param1.length());
  98.          if(_loc3_ == param2.length())
  99.          {
  100.             _loc4_ = 0;
  101.             while(_loc4_ < _loc3_ && param1[_loc4_] === param2[_loc4_])
  102.             {
  103.                _loc4_++;
  104.             }
  105.             return _loc4_ == _loc3_;
  106.          }
  107.          return false;
  108.       }
  109.       
  110.       public function watcherFired(param1:Boolean, param2:int) : void
  111.       {
  112.          var commitEvent:Boolean = param1;
  113.          var cloneIndex:int = param2;
  114.          if(mx_internal::isHandlingEvent)
  115.          {
  116.             return;
  117.          }
  118.          try
  119.          {
  120.             mx_internal::isHandlingEvent = true;
  121.             execute(cloneIndex);
  122.          }
  123.          finally
  124.          {
  125.             mx_internal::isHandlingEvent = false;
  126.          }
  127.       }
  128.       
  129.       public function execute(param1:Object = null) : void
  130.       {
  131.          var o:Object = param1;
  132.          if(!mx_internal::isEnabled)
  133.          {
  134.             return;
  135.          }
  136.          if(mx_internal::isExecuting || twoWayCounterpart && twoWayCounterpart.mx_internal::isExecuting)
  137.          {
  138.             hasHadValue = true;
  139.             return;
  140.          }
  141.          try
  142.          {
  143.             mx_internal::isExecuting = true;
  144.             wrapFunctionCall(this,innerExecute,o);
  145.          }
  146.          finally
  147.          {
  148.             mx_internal::isExecuting = false;
  149.          }
  150.       }
  151.       
  152.       private function innerExecute() : void
  153.       {
  154.          var _loc1_:Object = wrapFunctionCall(mx_internal::document,mx_internal::srcFunc);
  155.          if(BindingManager.debugDestinationStrings[mx_internal::destString])
  156.          {
  157.             trace("Binding: destString = " + mx_internal::destString + ", srcFunc result = " + _loc1_);
  158.          }
  159.          if(hasHadValue || wrappedFunctionSuccessful)
  160.          {
  161.             if(!(lastValue is XML && Boolean(lastValue.hasComplexContent()) && lastValue === _loc1_) && !(lastValue is XMLList && lastValue.hasComplexContent() && _loc1_ is XMLList && nodeSeqEqual(lastValue as XMLList,_loc1_ as XMLList)))
  162.             {
  163.                mx_internal::destFunc.call(mx_internal::document,_loc1_);
  164.                lastValue = _loc1_;
  165.                hasHadValue = true;
  166.             }
  167.          }
  168.       }
  169.    }
  170. }
  171.  
  172.